// WismedCalTempDispatch.cpp : 用于调度温度准确性算法和快速升温算法。
#include "ExCalcTemp.h"
#include "CCalTemp.h"
#include "CFastTempHome.h"

extern char tempsteadyflag;					//温度稳定的标志
extern float totaltempdiff, totaltempdec;
extern bool hasCalcTempFactorLast;
extern float tempFactorNum;					//温变系数（应用于计算的）
extern float realTempFactorNum;				//实时温变系数
extern float realMicroCorrectTemp;			//实时微观修正值
extern bool debugFlagUseTempFactor;			//是否用闻变系数更新温度

#define FastTemp_Threshold      32.0f
#define EndOut_Stage   0			// 结束快速升温输出
#define FixedOut_Stage  1	// 固定快速升温输出 持续3分钟
#define ContinueOut_Stage  2	// 持续快速升温输出阶段 持续判断快速计算值与准确值大小

static bool needInit = true;	// 根据自己的需求，在需要时初始化
static	int fast_flag = 0; // 是否快速升温，0：准确性算法输出，1：快速算法输出
static int fast_timecnt = 0;
static int fase_time_start = EndOut_Stage;
static bool jumpFastTemp = false;			// 是否主动退出快速升温算法

// **调整，增加一个全局变量，用于保存上一个快速升温的初始温度** //
static float last_tempini = 0;
// **调整结束** //

/*温度调度函数接口   dataInterval 固定2s*/
float CalTempDispatch(float surfTemp, float envTemp, int dataInterval)
{

	// 算法初始化调用
	if (needInit) {
		needInit = !needInit;
		// 初始化稳定性算法
		initCache();
		// 初始化快速升温算法
		fastTempInit();
		// 初始化调度
		fast_flag = 0;
		fast_timecnt = 0;
		jumpFastTemp = false;
		fase_time_start = EndOut_Stage;
	}

	// 稳定性算法
	float realTemp = CalTemp(surfTemp, envTemp, dataInterval);
	bool susSta = suspectOpen();
	bool isSensorOff = sensorOff();
	TempBuffPoint bufPoint = getBufferCache();
	int bufLen = getBuffValidLen();
	int bufStartIndex = getBuffStartIndex();

	float showTemp = realTemp;	// 实际显示的温度，默认为稳定性算法输出
	float ai_temp = -1;
	int flag_error = -1;
        int flag_stage = -1;
        float ai_ref_temp = 0;
        float tempini_check = 0;
				int fast_sta = 0;
	// 整体调度流程
	if (!jumpFastTemp) {
		// 快速升温算法
		FastTempResult_t fastRst = wendu(surfTemp, envTemp, bufPoint, bufLen, bufStartIndex, 1);

		ai_temp = fastRst.shijiwendu;
					fast_sta = fastRst.using_fast_flag;
		ai_ref_temp = fastRst.chushiwendu_tb;	// 快速升温判定的初始温度
		bool fastTempIsStable = fastRst.flat_wendingxing == 1;	// 快速升温判定温度稳定
		flag_error = fastRst.flag_error;
                flag_stage = fastRst.stage;
					tempini_check = fastRst.last_tempini_check;
		if ((ai_ref_temp <= FastTemp_Threshold) && (fast_sta == 1) && (fast_flag == 0))//启动快速升温算法输出
		{
			fast_flag = 1;
			fast_timecnt = 0;
			fase_time_start = FixedOut_Stage;
		}
		else if ((ai_ref_temp > FastTemp_Threshold) && (fast_sta == 1)) {
			// 虽然内部认定可以进入快速升温，但是初始温度高于30摄氏度，暂时不引用，防止预测温度偏差过大
			jumpFastTemp = true;
		}
		else if (surfTemp > FastTemp_Threshold && fast_sta == 0) {
                        // 体表温度已经高于30摄氏度，依然没有进入快速升温，跳出快速升温
                        jumpFastTemp = true;
                }
		switch (fase_time_start)
		{
		case FixedOut_Stage:
			if (fast_timecnt < 90)//3分钟 2s*90
				fast_timecnt++;
			else
			{
				fase_time_start = ContinueOut_Stage;
				fast_timecnt = 0;
			}
			// **调整，在快速升温计时阶段，如果初始温度发生变化，重置3分钟计时时间** //
						if (tempini_check == 1)
                        {
                                fast_timecnt = 0;
                        }
                        // **调整结束** //
                        if (flag_error == 1)
                        {
                                showTemp = ai_temp;
                                // 在快速升温预测出结果前发生异常，初始化一次，从头再来
                                fastTempInit();
							// 初始化调度
							fast_flag = 0;
							fast_timecnt = 0;
							jumpFastTemp = false;
							fase_time_start = EndOut_Stage;
                        }
                        else if (flag_error == 2)
                        {
                                showTemp = realTemp;
                                jumpFastTemp = true;
                        }
			break;
		case ContinueOut_Stage:
			if ((fabs(ai_temp - realTemp) < 0.3) || fastTempIsStable)//相差在0.3度以内
			{
				fase_time_start = EndOut_Stage;
				jumpFastTemp = true;
			}
			if (flag_error != 0)
                        {
                                showTemp = realTemp;
                                jumpFastTemp = true;
                        }
			break;
		default:
			break;
		}

		if (fast_flag == 1 && !jumpFastTemp) {
			//快速输出赋值
			showTemp = ai_temp;
		}
		else if (jumpFastTemp) {
			// todo 首次判断需要跳出快速升温，后面做温度切换后的过度优化

			// 显示准确性算法输出值
			showTemp = realTemp;
			// todo 初始化快速升温算法
			fastTempInit();
			
			fast_flag = 0;
		}
		else {
			// 显示准确性算法输出值
			showTemp = realTemp;
		}
	}
	else
	{
		fast_flag = 0;
	}

	if (isSensorOff) {
		showTemp = realTemp;
		needInit = true;
	}
	// 为快速升温算法的进入提供另一种条件（低于32摄氏度如果没触发那就触发它）
        if (surfTemp < FastTemp_Threshold && jumpFastTemp) {
                jumpFastTemp = false;
        }
	
	return showTemp;
}

//检测数据输出源
bool suspectDataSrc() {
	return fast_flag;
}
